package com.ruoyi.business.vo;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.List;

/**
 * @Author ty
 * @Date 2025-07-29 11:30
 */
@Data
public class SendLogisticsVo {

    private Long orderNo;//订单编号
    private Integer orderStatus;//订单状态：0-创建；1-部分支付；2-已支付；3-待发货；4-部分发货；5-已发货；7-确认收货；8-完成；9-取消
    private List<OrderTimeInfo> orderTimeInfos;//订单状态变更时间信息
    private List<PackageInfo> packageList;//包裹信息

    @Data
    @AllArgsConstructor
    public static class OrderTimeInfo {
        //更改订单状态时，其前置所有状态的时间都需要上传
        //101-订单创建时间；102-支付完成时间；103-可发货时间；104-订单首次发货时间；105-发货完成时间；106-确认收货时间；107-订单完成时间；108-订单取消时间
        private Integer type;
        //时间毫秒值
        private Long value;
    }

    @Data
    public static class PackageInfo {
        private List<PackageItem> packageItems;//包裹项列表
        private SendInfo sendInfo;//交付方信息
        private DeliveryImportInfo deliveryImportInfo;//物流信息
        private Long deliveryTime;//包裹发货时间
        private Integer deliveryMethod;//发货方式:1-快递物流 ；2-无需物流 ；3-同城配送 ；4-商家配送 ；5-到店自提
        private ReceiveInfo receiveInfo;//接收方信息
    }

    @Data
    @AllArgsConstructor
    public static class PackageItem {
        private String outItemId;//外部订单项 ID
        private String skuNum;//商品数量
    }

    @Data
    public static class SendInfo {
        private AddressInfo addressInfo;//地址信息
        private String senderAddress;//发货人完整地址信息
        private SenderInfo senderInfo;//发货人信息
        private Long processVid;//操作门店的组织 ID
        private String processVidName;//操作门店名称
    }

    @Data
    public static class SenderInfo {
        private String senderName;//发货人名称
        private String senderMobile;//发货人电话
    }

    @Data
    public static class DeliveryImportInfo {
        private String companyCode;//物流公司代码
        private String number;//快递单号
        private Long expectReceivedStartTime;//预计配送开始时间，时间戳，毫秒级
        private Long expectReceivedEndTime;//预计配送结束时间
        private String companyName;//物流公司名称
        private Long expectReceivedDate;//预计配送时间
        private Integer expectReceivedType;//预计配送类型:1-自定义时间段；2-工作日、双休日或节假日可送货；3-只工作日送货；4-只双休日；节假日送货；5-尽快送达
    }

    @Data
    public static class ReceiveInfo {
        private String receiverAddress;//收货人完整地址信息
        private AddressInfo addressInfo;//发货地址
        private ReceiverInfo receiverInfo;//发货地址
    }

    @Data
    public static class AddressInfo {
        private String area;//乡镇/街道
        private String zip;//收货人邮编
        private String address;//详细地址
        private AddressExt addressExt;//收货地址扩展信息
        private String province;//省份
        private String city;//城市
        private String latitude;//维度
        private String county;//区/县
        private String longitude;//经度
    }

    @Data
    public static class ReceiverInfo {
        private String receiverName;//收货人名称
        private String receiverMobile;//收货人电话
    }

    @Data
    public static class AddressExt {
        private String areaCode;//收货人所在乡镇/街道编码
        private String countyCode;//收货人所在区/县编码
        private String cityCode;//收货人所在城市编码
        private String provinceCode;//收货人所在省份编码
    }
}

